package com.zff.rental.utils.specification;

import org.springframework.data.domain.Sort;

import java.util.ArrayList;
import java.util.List;

import static org.springframework.data.domain.Sort.Direction.ASC;
import static org.springframework.data.domain.Sort.Direction.DESC;

/**
 * @author HCY
 */
public final class SortBuilder {
    private final List<Sort.Order> orders = new ArrayList<>();

    public SortBuilder() {
    }

    /**
     * @param name 字段名称
     *             根据字段名正序排序
     */
    public SortBuilder asc(String name) {
        return asc(SpecConfig.isIgnoreByName(name), name);
    }

    /**
     * @param name 字段名称
     *             根据字段名倒序排序
     */
    public SortBuilder desc(String name) {
        return desc(SpecConfig.isIgnoreByName(name), name);
    }

    /**
     * @param isIgnore 是否忽略
     * @param name     字段名称
     *                 根据字段名正序排序
     */
    public SortBuilder asc(boolean isIgnore, String name) {
        if (!isIgnore) {
            orders.add(new Sort.Order(ASC, name));
        }
        return this;
    }

    /**
     * @param isIgnore 是否忽略
     * @param name     字段名称
     *                 根据字段名倒序排序
     */
    public SortBuilder desc(boolean isIgnore, String name) {
        if (!isIgnore) {
            orders.add(new Sort.Order(DESC, name));
        }
        return this;
    }

    /**
     * 构建排序对象
     */
    public Sort build() {
        return Sort.by(orders);
    }

    /**
     * 构建排序构建对象
     */
    public static SortBuilder builder() {
        return new SortBuilder();
    }

    /**
     * 简单的正序排序
     */
    public static Sort by(String... properties) {
        return Sort.by(properties);
    }
}
